/**
 *  给定一个含有 n 个正整数的数组和一个正整数 s ，找出该数组中满足其和 >= s 的长度最小的连续子数组，
 *  并返回其长度。如果不存在符合条件的子数组，返回 0。
 *  示例：
 *  输入：s = 7, nums = [2,3,1,2,4,3] 输出：2 解释：子数组 [4,3] 是该条件下的长度最小的子数组。
 */


//数组操作中另一个重要的方法：滑动窗口。
//所谓滑动窗口，就是不断的调节子序列的起始位置和终止位置，从而得出我们要想的结果.

/**
 * 思路:滑动窗口,双指针法的一种.一个指针指向的终止位置,另一个指针指向起始位置,不断的移动,不断地对sum求和,移动终止
 * 位置指针,当求和大于等于目标值时,移动起始位置的指针,直到终止位置指针到达数组的末尾.
 */

const numsArr = [2, 3, 1, 2, 4, 3];
function minSubArrayLen(nums, target) {
  //l指向起始位置,r指向终止位置,第一层while控制r,第二层while控制l.
  const len = nums.length;
  let l = r = sum = 0, res = len + 1;
  while (r < len) {
    sum += nums[r++];
    while (sum >= target) {
      res = res < r - l ? res : r - l;
      sum -= nums[l++];
    }
  }
  return res > len ? 0 : res;
}
console.log(minSubArrayLen(numsArr, 7));//2   [4,3]是最小子串.